%include "nodo.mac"
extern free

;void borrar(Lista* lista, Uint32 x, Uint32 y)
global borrar

%define ptr_lista [ebp + 8]
%define x [ebp + 12]
%define y [ebp + 16]
%define rango_50 50
%define min_x [ebp-4]
%define min_y [ebp-8]
%define max_x [ebp-12]
%define max_y [ebp-16]

section .text

borrar:
	push ebp			; creo el marco de la pila
	mov ebp, esp	
	sub esp, 16			; 16 bytes para las vars locales min_x, min_y, max_x, max_y	

	push ebx			; salvo registros convencion C
	push edi
	push esi

set_min_x:				; seteo minimos del intervalo a vars locales
	mov ebx, x
	sub ebx, rango_50
	mov dword min_x, ebx
	
set_min_y:
	mov ebx, y
	sub ebx, rango_50	
	mov dword min_y, ebx		; fin seteo minimos del intervalo a vars locales
	
set_max_x:				; seteo maximos del intervalo a vars locales
	mov ebx, x		
	add ebx, rango_50
	mov dword max_x, ebx
	
set_max_y:
	mov ebx, y
	add ebx, rango_50
	mov dword max_y, ebx		; fin seteo maximos del intervalo a vars locales
	
inicializar_punteros:
	mov eax, ptr_lista		; eax = puntero a lista
	mov edi, [eax]			; edi = puntero a primer nodo de la lista

ciclo:
	cmp edi, 0			; pregunto si tengo un nodo actual
	jne guardo_aux
	jmp fin
	
guardo_aux:
	mov esi, [edi + _prox]		; esi = puntero proximo nodo

mayor_minX:				; (actual->coor_x >= min_x) && (actual->coor_y >= min_y)?
	mov ecx, [edi + _x]		; ecx = actual->coord_x
	cmp ecx, min_x 			; (actual->coor_x >= minimo_x)?
	jnae siguiente		; si (actual->coord_x < minimo_x) me muevo al prox nodo de la lista

mayor_minY:			
	mov ecx, [edi + _y]		; ecx = actual->coord_y
	cmp ecx, min_y			; (actual->coor_y >= minimo_y)?
	jnae siguiente			; si (actual->coord_y < minimo_y) me muevo al prox nodo de la lista

menor_maxX:				; (actual->coor_x <= max_x) && (actual->coor_y <= max_y)?
	mov ecx, [edi + _x]		; ecx = actual->coord_x
	cmp ecx, max_x 			; (actual->coord_x <= max_x)?
	ja siguiente			; si (actual->coord_x > max_x) me muevo al prox nodo de la lista

menor_maxY:			
	mov ecx, [edi + _y]		; ecx = actual->coord_y
	cmp ecx, max_y		 	; si (actual->coord_y > max_y) me muevo al prox nodo de la lista
	ja siguiente

en_rango:
	mov ecx, [edi + _prev]		; ecx = puntero al nodo anterior
	cmp ecx, 0
	je sin_prev

con_prev:
	mov [ecx + _prox], esi
	jmp ver_prox
	
sin_prev:
	mov eax, ptr_lista		; eax = puntero a la lista
	mov [eax], esi
	
ver_prox:
	cmp esi, 0
	je liberar
	
con_prox:
	mov [esi + _prev], ecx
	
liberar:

	push edi
	call free
	add esp, 4
	
siguiente:
	mov edi, esi
	jmp ciclo

fin:
	pop esi				; desarmo el marco de pila
	pop edi
	pop ebx
	add esp, 16
	pop ebp

	ret
